// od_descrypt crime [可重复选的组合] 解密犯罪时间
// https://blog.csdn.net/k778899jx/article/details/118934953
// 警察在侦破一个案件时，得到了线人给出的可能犯罪时间，形如“HH.MM”表示时刻。
// 根据警察跟线人的约定，为了隐蔽，该时间是改过的，密文规则为：利用出现过的数字，
// 构造下一个距离当前时间最近的时刻，则该时间为可能犯罪的时间，每个出现数字都可以无限次使用。
// 备注：线人给的时间一定是合法的，最近的时刻有可能在第二天。
// 样例 1:
// 输入: “19:34”
// 输出: “19:39”
// 解释: 利用数字 1, 9, 3, 4 构造出来的最近时刻是 19:39，是 5 分钟之后。结果不是
// 19:33 因为这个时刻是 23 小时 59 分钟之后。 样例 2: 输入: “23:59” 输出:
// “22:22” 解释: 利用数字 2, 3, 5, 9 构造出来的最近时刻是 22:22。
// 答案一定是第二天的某一时刻，所以选择可构造的最小时刻。

#include <bits/stdc++.h>
using namespace std;

#define DEBUG_
#ifdef DEBUG_
#define PF(...) printf(__VA_ARGS__)
#define FRE(x)                    \
  freopen("d:/oj/" #x ".in", "r", \
          stdin)  //,freopen("d:/oj/"#x".out","w",stdout)
#define FREC fclose(stdin), fclose(stdout);
#else
#define PF(...)
#define FRE(x)
#define FREC
#endif

const static int MAX_VAL = 0X5fffffff;
int getMinute(string sTime) {
  int hour = 0, minute = 0;
  sscanf(sTime.c_str(), "%2d%2d", &hour, &minute);
  if (hour > 23 || minute > 59) {
    return MAX_VAL;
  }
  PF("%s[%d:%d]\n", sTime.c_str(), hour, minute);
  return (hour * 60) + minute;
}

string getCrimeTime(string sTime) {
  int time1 = getMinute(sTime);

  std::sort(sTime.begin(), sTime.end());
  int i = 0;
  int nMinDiff = MAX_VAL;
  string res;
  do {
    int time2 = getMinute(sTime);
    int nDiff1 = time2 - time1;
    if (nDiff1 > 0 && nDiff1 < nMinDiff) {
      nMinDiff = nDiff1;
      res = sTime;
      PF("select 1\n");
    }
    int nDiff2 = 24 * 60 + time2 - time1;
    if (nDiff2 > 0 && nDiff2 < nMinDiff) {
      nMinDiff = nDiff2;
      res = sTime;
      PF("select 2\n");
    }
    PF("%d, %s,   %d,%d\n", i, sTime.c_str(), nDiff1, nDiff2);
    i++;
  } while (next_permutation(sTime.begin(), sTime.end()));
  return res;
}

vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
  candidates_ = candidates;
  dfs(target, {}, 0);
  return res_;
}

int main() {
  //    string out = getCrimeTime("1852");    printf("%s\n", out.c_str());
  vector<string> out = permutation("1852");
  for (auto s : out) PF("%s\n", s.c_str());
  PF("\n");
  return 0;
}
